package com.wf.springboot.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Collections;

import static com.wf.springboot.generator.config.GeneratorConfig.*;

/**
 * @author: wf
 * @created: 2024/6/28 0:24
 */

public class CodeGenerator {


    public static void main(String[] args) {
        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                //全局配置
                .globalConfig(builder -> {
                    builder.author(AUTHOR)
                            .commentDate(COMMENT_DATE)
                            //启用swagger,会在实体类上生成swagger注解
                            .enableSwagger()
                            //代码生成的位置
                            .outputDir(LOCATION_OF_CODE_GENERATION)
                            //代码生成完成后禁止自动打开
                            .disableOpenDir();
                })
                //包配置策略
                .packageConfig(builder -> {
                    builder.parent(PARENT_PACKAGE)//父包
                            //.moduleName(MODULE_NAME)//设置模块名(api请求前缀)
                            .entity(ENTITY_PACKAGE)//设置 Entity 包名
                            .mapper(MAPPER_PACKAGE)//设置 Mapper 包名
                            .xml(MAPPERS_PACKAGE)//设置 Mapper XML 包名
                            .service(SERVICE_PACKAGE)//设置 Service 包名
                            .serviceImpl(SERVICE_IMPL_PACKAGE)//设置 Service Impl 包名
                            .controller(CONTROLLER_PACKAGE)//设置 Controller 包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, XML_LOCATION));
                })
                .strategyConfig(builder -> {
                    builder.addInclude(CREATE_TABLE_LIST)//要生成的表名,可以写多个
                            //.addTablePrefix(ADD_TABLE_PREFIX)//增加过滤表前缀
                            .entityBuilder()
                            .idType(ID_TYPE)//全局主键类型
                            .enableChainModel()//开启链式模型
                            .enableLombok()//开启 Lombok 模型
                            .addTableFills(new Column("create_by", FieldFill.INSERT),
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_by", FieldFill.INSERT_UPDATE),
                                    new Column("update_time", FieldFill.INSERT_UPDATE))//填充字段
                            .logicDeleteColumnName("del_flag")//逻辑删除字段名(数据库字段)
                            .naming(NamingStrategy.underline_to_camel)//实体类命名下划线转大写
                            .columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体的命名策略
                            .enableFileOverride()//覆盖生成文件
                            //以上实体类配置
                            .mapperBuilder()
                            .superClass(BaseMapper.class)//生成的Mapper接口,继承BaseMapper
                            .enableBaseResultMap()//启用 BaseResultMap 生成
                            .enableBaseColumnList()//启用 BaseColumnList
                            .enableFileOverride()
                            //以上mapper配置
                            .serviceBuilder()
                            .superServiceClass(IService.class)//生成的service接口继承IService
                            .superServiceImplClass(ServiceImpl.class)//service实现类继承ServiceImpl
                            .formatServiceFileName("%sService")//生成的service命名规则 IxxxService
                            .formatServiceImplFileName("%sServiceImpl")//生成的service实现类命名规则 XxxServiceImpl
                            .enableFileOverride()
                            //以上service配置
                            .controllerBuilder()
                            .enableRestStyle()//生成的controller的注解是RestController
                            .enableFileOverride();
                            //以上controller配置
                }).execute();

    }


}
